﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using Helpers;
using Capa_Dominio;
using Capa_Persistencia_NH;
using Capa_Persistencia_NH.Interface;
using Capa_Persistencia_NH.AccesoDatos;

namespace Capa_TestingProyects
{
    [TestFixture]
    public class Test_Cliente
    {
        private ICliente adminCliente = null;
        int codigoGenerado = 0;
        TipoDocumento objTipoDocumento;
        Distrito objDistrito;

        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            TipoDocumentoDAO daoTipoDocumento;
            DistritoDAO daoDistrito;

            adminCliente = new ClienteDAO();
            daoTipoDocumento = new TipoDocumentoDAO();
            daoDistrito = new DistritoDAO();
            //foreach (Cliente cliente in adminCliente.ListarTodos())
            //    adminCliente.Eliminar(cliente);
            //Creamos clientes para tenerlos disponibles en las pruebas
            //adminCliente.Crear(new Cliente() { Apellidos = "Romero", Nombres = "César", CodigoDocumento = 1, NumeroDocumento = 12345, Email = "cromero@contraloria.gob.pe", FechaNacimiento = Convert.ToDateTime("30-06-1987"), ClaveAcceso = "pantera", Direccion = "Av. Las Begonias 526", CodigoDistrito = 1, Estado = true });

            objTipoDocumento = daoTipoDocumento.Obtener(1);
            objDistrito = daoDistrito.Obtener(1);
        }

        [Test]
        public void Test1_Crear()
        {
            Assert.IsNotNull(adminCliente);
            //se instancia a la entidad a crear
            Cliente objCliente = new Cliente();
            objCliente.Apellidos = "Valdivia";
            objCliente.Nombres = "Maria";
            objCliente.TipoDocumento = objTipoDocumento;
            objCliente.NumeroDocumento = "123456";
            objCliente.Email = "aries.cromero@gmail.com";
            objCliente.FechaNacimiento = Convert.ToDateTime("30-06-1987");
            objCliente.ClaveAcceso = "Capitan";
            objCliente.Direccion = "Av. La Molina 346";
            objCliente.Distrito = objDistrito;
            objCliente.Estado = true;

            //se declara la entidad que se retornara
            Cliente clienteRetornado = null;
            //no aseguramos que no retorne una exepcion
            Assert.DoesNotThrow(delegate
            {
                clienteRetornado = adminCliente.Crear(objCliente);
                codigoGenerado = clienteRetornado.CodigoCliente;
            },"Cliente Generado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(clienteRetornado);
            //verificamos que el codigo generado sera mayor que 0
            Assert.Greater(codigoGenerado, 0);
        }


        [Test]
        public void Test2_Modificar()
        {
            // 1. Clase a probar: ClienteDAO
            Assert.IsNotNull(adminCliente);
            // 2. Declaramos e instanciamos la entidad de dominio
            Cliente clienteAModificar = adminCliente.Obtener(codigoGenerado);
            clienteAModificar.Apellidos = "";
            clienteAModificar.Nombres = "";
            clienteAModificar.TipoDocumento = objTipoDocumento;
            clienteAModificar.NumeroDocumento = "122333";
            clienteAModificar.Email = "aries.cromero@hotmail.com";
            clienteAModificar.FechaNacimiento = Convert.ToDateTime("30-06-1987"); ;
            clienteAModificar.ClaveAcceso = "JavaNet";
            clienteAModificar.Direccion = "Av. Conquistadores 456";
            clienteAModificar.Distrito = objDistrito;
            clienteAModificar.Estado = true;

            // 3. Declaramos la entidad que contendrá el resultado
            Cliente clienteModificado = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                clienteModificado = adminCliente.Modificar( clienteAModificar);
            }, "cliente modificado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(clienteModificado);
            // Probamos que el código generado sea mayor a 0
            Assert.AreEqual(clienteModificado.CodigoCliente, codigoGenerado);
            // Probamos que el apellido registrado es igual al solicitado con la entidad
            Assert.AreEqual(clienteModificado.Apellidos, clienteAModificar.Apellidos);
            // Probamos que la dirección registrada es igual a la solicitada con la entidad
            Assert.AreEqual(clienteModificado.Direccion, clienteAModificar.Direccion);
        }

        [Test]
        public void Test3_Eliminar()
        {
            // 1. Clase a probar: ReservacionDAO
            Assert.IsNotNull(adminCliente);
            // 2. Definimos la entidad que contendrá el resultado
            Cliente clienteExistente = adminCliente.Obtener(codigoGenerado);
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                adminCliente.Eliminar(clienteExistente);
            });
            // Probamos que la entidad ya no existe
            Assert.IsNull(adminCliente.Obtener(codigoGenerado));
        }

        [Test]
        public void Test5_ListarXNombre()
        {
            // 1. Clase a probar: ClienteDAO
            Assert.IsNotNull(adminCliente);
            string nombreCliente = "Cesar";
            // Declaramos la entidad que contendrá el resultado
            ICollection<Cliente> clienteEncontrados = null;
            //  Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                //  Ejecutamos el método a probar
                clienteEncontrados = adminCliente.ListarXNombre(nombreCliente);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(clienteEncontrados);
            // Probamos que la cantidad de clientes encontrados sea igual o mayor que 1
            Assert.GreaterOrEqual(clienteEncontrados.Count, 1);
            // Probamos que cada local contenga la cadena de búsqueda
            foreach (Cliente clienteEncontrado in clienteEncontrados)
            {
                Assert.IsTrue(clienteEncontrado.Nombres.Contains(nombreCliente));
            }
        }


        [TestFixtureTearDown]
        public void TerminarPruebas()
        {
            NHibernateHelper.CerrarFabrica();
        }
    }
}
